#include <stdint.h>

// 表统计了-40,-38,……,0，2，4，…… 100 ℃时的阻值(单位：10Ω)，阻值二分查温度
// index *2 -40表示阻值对应的温度
#if 0
// NTC型号：QN0603X103F3435FA
const uint16_t NTC_data[] = {
    19739, 17635, 15782, 14151, 12711, 11434, 10304, 9299, 8404, 7604,     //-40~-22
    2745,  2518,  2312,  2125,  1956,  1801,  1660,  1532, 1415, 1308,     //-20~-2
    2745,  2518,  2312,  2125,  1956,  1801,  1660,  1532, 1415, 1308,     // 0~18
    1210,  1120,  1038,  963,   894,   831,   773,   719,  670,  624,      // 20~38
    582,   544,   508,   475,   444,   416,   390,   365,  343,  322,      // 40~58
    302,   284,   267,   252,   237,   223,   211,   199,  187,  177,      // 60~78
    167,   158,   150,   142,   134,   127,   120,   114,  108,  103,  98, // 80~100
};
#else
// NTC型号：TCTRxxxx#10K0#3950T
// 手册5°步进数据，靠插值补帧拟合得来的
const uint16_t NTC_data[] = {
    34690, 29955, 26291, 23117, 20362, 18010, 15876, 14052, 12457, 11059, //-40~-22
    9798,  8756,  7808,  6972,  6235,  5555,  5006,  4495,  4041,  3638,  //-20~-2
    3270,  2960,  2675,  2420,  2193,  1990,  1806,  1643,  1495,  1363,  // 0~18
    1249,  1144,  1045,  956,   876,   806,   737,   678,   624,   574,   // 20~38
    534,   489,   452,   418,   387,   362,   333,   309,   287,   267,   // 40~58
    250,   232,   216,   202,   188,   176,   165,   154,   144,   135,   // 60~78
    127,   119,   112,   105,   99,    93,    88,    83,    78,    74,    // 80~90
    69,    66,    62,    59,    56,    53,    50,    47,    45,    43,    // 100~118
    41,                                                                   // 120
};

#endif
/**
 * @brief  NTC阻值转换为温度数据返回
 * @note
 * @param  res: 组织数据，单位：10Ω
 * @retval   温度数据，单位：℃，有40°的偏移
 */
int8_t NTC_Res2Temp(uint16_t res)
{
    int left  = 0;
    int right = sizeof(NTC_data) / sizeof(NTC_data[0]) - 1;
    int mid   = 0;
    if (res >= NTC_data[left]) {
        return 0;
    }
    else if (res <= NTC_data[right]) {
        return (right + 1) * 2;
    }

    while (left + 1 < right) {
        mid = left + (right - left) / 2; // 防止(left + right)整型溢出
        if (NTC_data[mid] == res) {
            return mid * 2;
        }
        else if (NTC_data[mid] > res) {
            left = mid;          // 调整搜索区间到右半部分
        }
        else {
            right = mid;         // 调整搜索区间到左半部分
        }

        if (left + 1 >= right) { // 已经没有数据，找最接近
            // L R区间数据四等分，1返回L，23返回M，4返回R
            if (res >= (3 * NTC_data[left] + NTC_data[right]) / 4) {
                return left * 2;
            }
            else if (res <= (NTC_data[left] + 3 * NTC_data[right]) / 4) {
                return right * 2;
            }
            else {
                return left * 2 + 1;
            }
        }
    }
    return -1;
}
